package br.eng.eliseu.gwt.gestaoWeb.server.util;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;


public class XMLUtil {

	public static Document getArquivoBin(String path, final String nomeArquivo) throws Exception {
		
		File diretorioBin = null;
		if (path == null || path.equals("")) {

			File grpHome = EnviromentUtil.getGrpHomeDir();
			File[] diretoriosBin = grpHome.listFiles(new FileFilter() {
				public boolean accept(File pathname) {
					return pathname.isDirectory()
							&& pathname.getName().toUpperCase().equals("BIN");
				}
			});
			if (diretoriosBin.length == 0) {
				throw new Exception("Não existe uma pasta de Bin dentro do diretório GRP_HOME");
			}
			if (diretoriosBin.length > 1) {
				throw new Exception("Existem 2 pastas Bin dentro do diretório GRP_HOME");
			}
			diretorioBin = diretoriosBin[0];
		} else {
			diretorioBin = new File(path);
			if (!diretorioBin.exists()) {
				throw new Exception("Diretorio de bins informados manualmente não existem");
			}
			if (!diretorioBin.isDirectory()) {
				throw new Exception("Caminho dos bins informados não é umm diretório");
			}
		}

		File[] arquivos = diretorioBin.listFiles(new FileFilter() {
			public boolean accept(File pathname) {
				String a = nomeArquivo;
				return pathname.isFile() && pathname.getName().toUpperCase().equals(a.toUpperCase());
			}
		});
		if (arquivos.length == 0) {
			throw new Exception("Arquivo não encontrado diretorio "
					+ diretorioBin.getAbsolutePath() + " arquivo " + nomeArquivo);
		}
		return getArquivoBin(arquivos[0]);
	}

	public static Document getArquivoBin(File arquivoBin) throws Exception {
		DocumentBuilder builder;
		Document doc;
		try {
			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			if (!arquivoBin.exists()) {
				throw new Exception("Arquivo xml inexistente: " + arquivoBin.getName());
			}
			doc = builder.parse(arquivoBin);
			return doc;
			
		} catch (ParserConfigurationException e) {
			throw new Exception("Erro ao ler o arquivo XML: " + arquivoBin.getName(), e);
		} catch (SAXException e) {
			throw new Exception("Erro ao ler o arquivo XML: " + arquivoBin.getName(), e);
		} catch (IOException e) {
			throw new Exception("Erro ao ler o arquivo XML: " + arquivoBin.getName(), e);
		}

	}

}
